<?php
/**
 * Created by PhpStorm.
 * User: edmmss
 * Date: 2018/11/9
 * Time: 10:31
 */

namespace app\modules\factoryMethod\controller;

use app\modules\factoryMethod\factory\AbstractFactoryMethod;
use app\modules\factoryMethod\factory\GermanFactory;
use app\modules\factoryMethod\factory\ItalianFactory;
use yii\web\Controller;

/**
 * Class DefaultController
 * @package app\modules\factoryMethod\controller
 */
class DefaultController extends Controller
{
    /**
     * 工厂方法模式示例
     * 对比简单工厂模式的优点是，您可以将其子类用不同的方法来创建一个对象。
     * 这种模式是「真正」的设计模式， 因为他实现了S.O.L.I.D原则中「D」的 「依赖倒置」。
     * 这意味着工厂方法模式取决于抽象类，而不是具体的类。 这是与简单工厂模式和静态工厂模式相比的优势。
     * 依赖倒置原则
     * 1.上层模块不应该依赖底层模块，它们都应该依赖于抽象
     * 2.抽象不应该依赖于细节，细节应该依赖于抽象
     *
     * @date   2018/11/9
     * @author edmmss
     * @return int
     */
    public function actionIndex()
    {
        $factory = new ItalianFactory();
        $vehicle = $factory->create(AbstractFactoryMethod::TYPE_CHEAP);
        var_dump($vehicle->getAdditional());
        var_dump($vehicle);

        $vehicle = $factory->create(AbstractFactoryMethod::TYPE_FAST);
        var_dump($vehicle->getAdditional());
        var_dump($vehicle);

        $factory = new GermanFactory();
        $vehicle = $factory->create(AbstractFactoryMethod::TYPE_CHEAP);
        var_dump($vehicle->getAdditional());
        var_dump($vehicle);

        $vehicle = $factory->create(AbstractFactoryMethod::TYPE_FAST);
        var_dump($vehicle->getAdditional());
        var_dump($vehicle);

        return true;
    }
}